import axios from 'axios'
import store from '@/store'
import router from '@/router/index.js'
//  创建axios实例
var instance = axios.create({
  //  请求超过5秒即超时返回错误
  timeout: 5000,
  headers: { 'Content-Type': 'application/json' }
})
//  重新登录
var toLogin = () => {
  //  可能是token过期，清除它
  store.dispatch('UserLogout')
  //  跳转到登录页面
  router.replace({
    path: 'login',
    //  将跳转的路由path作为参数，登录成功后跳转到该路由
    query: { redirect: router.currentRoute.fullPath }
  })
}
//  request拦截器
instance.interceptors.request.use(
  config => {
    //  判断是否存在token，如果存在的话，则每个http header都加上token
    if (store.state.token) {
      config.headers.Authorization = `Bearer ${store.state.token}`
    }
    return config
  }
)

// response 拦截器
instance.interceptors.response.use(
  response => {
    const code = response.status
    if (code < 200 || code > 300) {
      Notification.error({
        title: response.message
      })
      return Promise.reject(new Error('error'))
    } else {
      return response.data
    }
  },
  error => {
    let code = 0
    try {
      code = error.response.data.status
    } catch (e) {
      if (error.toString().indexOf('Error: timeout') !== -1) {
        Notification.error({
          title: '网络请求超时,',
          duration: 2500
        })
        return Promise.reject(error)
      }
      if (error.toString().indexOf('Error: Network Error') !== -1) {
        Notification.error({
          title: '网络请求错误',
          duration: 2500
        })
        //  重新登录
        toLogin()
        return Promise.reject(error)
      }
    }
    if (code === 401) {
      this.$confirm(
        '登录已失效，请重新登录',
        '系统提示',
        {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
        }
      ).then(() => {
        //  重新登录
        toLogin()
      })
    } else if (code === 403) {
      Notification.error({
        title: '无权限访问',
        duration: 2500
      })
    } else {
      const errorMsg = error.response.data.message
      if (errorMsg !== undefined) {
        Notification.error({
          title: errorMsg,
          duration: 2500
        })
      }
    }
    return Promise.reject(error)
  }
)
export default instance
